|
|
|
Lab 2 --
Structural VHDL
Part 2
-- Parameterised models
Цел |
Целта на упражнението е да се придобият знания за
създаване на параметризирани VHDL модели и практически умения за
използването им в по-сложни проекти.
|
Задание
|
Да се разработи универсален модел
на суматор с последователен пренос (фигура 1), който събира две
N-битови числа A и B и входен пренос CIN. Резултатът е
N-битова сума S и изходен пренос COUT. Да се провери
правилното функциониране на модела чрез симулация.
|
|

|
|
Фигура 1-- Схема на N-битов суматор
с последователен
пренос |
Задача
1
Запознайте се с даденото по-долу
(фигура 2) описание на модела ADDERN и на тестовата постановка TESTBENCH.
Обърнете внимание на използваните VHDL конструкции: масиви, функции,
дефинирани от потребителя типове, оператор generate и
др.
Интерфейсна част
Съгласно заданието, суматора трябва да има
следните входно / изходни сигнали:
|
Сигнал |
Функция |
Разрядност |
Посока |
|
A
|
събираемо
|
N
|
вход
|
|
B
|
събираемо
|
N
|
вход
|
|
CIN
|
входен пренос |
1
|
вход
|
|
S
|
сума
|
N
|
изход
|
|
COUT
|
изходен пренос |
1
|
изход
|
Портовете A, B и S са от тип
std_logic_vector. Това са едномерни масиви, чиито елементи са от тип
std_logic. Размерността на масивите и респективно разрядността на
описваните от тях сигнали се задава от параметъра N, дефиниран в оператора
generic. Конкретната стойност на N се указва чрез оператора
generic map в схемата, която ще използва модела ADDERN като
компонент.
Архитектурна част
N-битов суматор с последователен пренос
може да се конструира от N еднобитови суматора. VHDL реализацията на
подобен параметризиран модел се базира на оператора generate. Той е
подобен на операторите за цикъл, но за разлика от тях описва повтарянето
на компоненти в структурното описание на схема, а не повтарянето на
действия във времето. Описанието на архитектурата на суматора е
следното:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; entity adderN is
generic(N : integer);
port (a, b : in std_logic_vector(N downto 1); cin : in std_logic;
s : out std_logic_vector(N downto 1); cout : out std_logic);
end adderN; architecture STRUCTURAL of ADDERN is component ADDER1
port (X, Y, CIN : in std_logic; SUM, COUT : out std_logic);
end component; signal C : std_logic_vector(N downto 0); begin C(0) <= CIN;
COUT <= C(N);
GEN: for I in 1 to N generate
ADD: ADDER1 port map (X=>A(I), Y=>B(I), CIN=>C(I-1), S=>S(I), COUT=>C(I));
end generate;end STRUCTURAL;
|
|
Фигура 2 -- Параметричен модел на N-битов суматор |
Модел на еднобитов суматор.
За еднобитовия суматор се използва модела
ADDER1 от Lab 1 -- part 1.
Тестова уостановка
Схемата на автоматизирана тестова установка
за проверка на модела на суматор е показана на фигура 3.
|

|
|
Фигура 3-- Тестова установка за
8-битов суматор |
За тестването на модела е реализиран
8-битов суматор. Той е включен като компонент в тестова установка с име
TESTBENCH (фигура 4). Конкретната разрядност на суматора е указана в
оператора generic map (N). Тестовите вектори са записи от тип
TEST_RECORD. Те са организирани в масива TEST_VECTORS.
Самото тестване се извършва от процеса
TEST. Той взема един запис от масива TEST_VECTORS, подава го към суматора
и след 100ns проверява дали получените сума и пренос съответстват на
очакваните стойности, записани в
TEST_VECTORS.
library IEEE;
use IEEE.std_logic_1164.all;
entity TESTBENCH is end;
architecture ADDER8 of TESTBENCH is
component ADDERN
generic(N : integer);
port (A, B : in std_logic_vector(N downto 1); CIN : in std_logic;
S : out std_logic_vector(N downto 1); COUT : out std_logic);
end component;
constant N : integer := 8;
signal A, B, S : std_logic_vector(N downto 1);
signal CIN, COUT : std_logic;
type TEST_RECORD is record
A, B, S : std_logic_vector(N downto 1); CIN, COUT : std_logic;
end record;
type TEST_ARRAY is array(positive range <>) of TEST_RECORD;
constant TEST_VECTORS : TEST_ARRAY := (
(A=>"00000000", B=>"00000001", CIN=>'0', S=>"00000001", COUT=>'0'),
(A=>"00000101", B=>"00000001", CIN=>'1', S=>"00001000", COUT=>'0'),
(A=>"00000011", B=>"11111100", CIN=>'0', S=>"11111111", COUT=>'0'),
(A=>"00000011", B=>"11111100", CIN=>'1', S=>"00000000", COUT=>'1'),
(A=>"01010101", B=>"01010101", CIN=>'0', S=>"10101010", COUT=>'0'),
(A=>"00000000", B=>"00000000", CIN=>'0', S=>"00000000", COUT=>'0'));
type STDLOGIC_TO_CHAR is array(std_logic) of character;
constant STDL2CHAR : STDLOGIC_TO_CHAR := (
'U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-');
function STDLV2STR(INP : std_logic_vector) return string is
variable RESULT : string(INP'range);
begin
for I in INP'range loop
RESULT(I) := STDL2CHAR(INP(I));
end loop;
return RESULT;
end;
begin
UUT: ADDERN generic map(N)
port map(A => A, B => B, CIN => CIN, S => S, COUT => COUT);
TEST: process
begin
for I in TEST_VECTORS'range loop
A <= TEST_VECTORS(I).A;
B <= TEST_VECTORS(I).B;
CIN <= TEST_VECTORS(I).CIN;
wait for 100 ns;
assert (S = TEST_VECTORS(I).S)
report "S (simulated)= " & STDLV2STR(S) &
" S(test vector)= " & STDLV2STR(TEST_VECTORS(I).S);
assert (COUT = TEST_VECTORS(I).COUT)
report "COUT (simulated)= " & STDL2CHAR(COUT) &
"COUT(test vector)=" & STDL2CHAR(TEST_VECTORS(I).COUT);
end loop;
wait;
end process;
end;
|
|
Фигура 4 -- Тестова установка
за модела на
суматор. |
Компилирайте файловете ADDERN.VHD
и ADDNTEST.VHD.
Симулирайте библиотечната единица TESTBENCH и проверете работоспособността
на модела. За симулацията използвайте командата run forever. Обяснете на
какво се дължи полученото съобщение за грешка. Определете бързодействието
на суматора.
Като използвате модела ADDERN, съставете
описание на тестова постановка за 16-битов суматор. Напишете тестови
вектори, които да активират критичния път в схемата. От резултатите от
симулацията определете бързодействието на суматора.
Задача 2
Съставете параметричен модел на N-битов
регистър (фигура 5). Входните данни DIN(1-N) се записват в регистъра при
ниско ниво на сигнала ENABLE и нарастващ фронт на CLOCK. Регистъра се
нулира при ниско ниво на входа CLEAR. Като запомнящи елементи използвайте
D-тригери управлявани по фронт.
Проектирайте тестова установка за проверка
на модела. Използвайте масив с тестови вектори и автоматична проверка на
разултатите.
|

|
|
Фигура 5 -- Символно означение на
N-битов
регистър. |
--- Край на Lab2 -- part2
--- |